Skip to content

feat(telemetry): add observability release wiring#175

Merged
ian-pascoe merged 5 commits into
mainfrom
feat/telemetry-observability-loop
Jun 29, 2026
Merged

feat(telemetry): add observability release wiring#175
ian-pascoe merged 5 commits into
mainfrom
feat/telemetry-observability-loop

Conversation

@ian-pascoe

@ian-pascoe ian-pascoe commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Summary

Runtime and web telemetry now produce useful anonymous usage and error signals across the CLI, landing page, docs, and catalog without exposing user content. Sentry source maps are uploaded from all runtime package builds and the web deploy/release workflows now map consolidated GitHub secrets into the public/runtime environment variables each target needs.

This also refreshes the workspace dependency/toolchain set, including Astro 7, Vite 8, pnpm 11.9 via mise.toml, and Babel 8. Code Mode static analysis now recognizes Babel 8 ImportExpression nodes so dynamic imports still produce the intended IMPORT_UNAVAILABLE diagnostic instead of falling through to cryptic TypeScript errors.

Notes

  • GitHub Actions secrets use consolidated non-public names and workflows map them to PUBLIC_* only at build/deploy time.
  • Catalog frontend and worker Sentry reporting now share the consolidated catalog DSN/project wiring.
  • caplets, @caplets/opencode, @caplets/pi, and @caplets/core all use the Sentry Rollup plugin for source map upload.

Validation

  • pnpm verify
  • Pre-push hook reran pnpm verify successfully before pushing

Compound Engineering
Codex

Summary by CodeRabbit

  • New Features

    • Added anonymous telemetry and observability across landing, docs, and catalog surfaces.
    • Install commands can now carry a nonsecret attribution marker, and catalog interactions/searches are tracked more consistently.
    • Production and preview deploys now verify observability settings and source-map readiness.
  • Bug Fixes

    • Improved error reporting so runtime and catalog issues are captured more reliably without disrupting the app.
  • Documentation

    • Expanded privacy, telemetry, and troubleshooting docs to explain anonymous data handling and install attribution.

@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@ian-pascoe, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 7 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: d5a81a55-3801-40fa-bfdd-13ddafe516aa

📥 Commits

Reviewing files that changed from the base of the PR and between 5fc375a and eafc4d7.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (45)
  • .caplets.lock.json
  • apps/catalog/src/components/CapletDetail.astro
  • apps/catalog/src/components/CatalogHeader.astro
  • apps/catalog/src/components/InstallCommand.astro
  • apps/catalog/src/components/SafetyNotice.astro
  • apps/catalog/src/components/SearchShell.astro
  • apps/catalog/src/components/ThemeToggle.astro
  • apps/catalog/src/lib/hugeicons.ts
  • apps/catalog/src/lib/server-observability.ts
  • apps/catalog/src/lib/status-icons.ts
  • apps/catalog/src/pages/api/v1/catalog/install-signals.ts
  • apps/catalog/src/scripts/observability.ts
  • apps/catalog/src/scripts/virtual-results.ts
  • apps/catalog/src/types/hugeicons-core-free-icons.d.ts
  • apps/catalog/test/ingest.test.ts
  • apps/catalog/test/observability.test.ts
  • apps/catalog/test/virtual-results.test.ts
  • apps/docs/src/scripts/observability.ts
  • apps/docs/test/observability.test.ts
  • apps/landing/src/scripts/observability.ts
  • apps/landing/test/observability.test.ts
  • package.json
  • packages/benchmarks/package.json
  • packages/cli/package.json
  • packages/core/package.json
  • packages/core/rolldown.config.ts
  • packages/core/src/cli.ts
  • packages/core/src/telemetry/index.ts
  • packages/core/src/telemetry/privacy.ts
  • packages/core/src/telemetry/runtime.ts
  • packages/core/src/telemetry/state.ts
  • packages/core/test/telemetry-cli.test.ts
  • packages/core/test/telemetry-redaction.test.ts
  • packages/core/test/telemetry-release.test.ts
  • packages/core/test/telemetry-runtime.test.ts
  • packages/core/test/telemetry-source-maps.test.ts
  • packages/core/test/telemetry-state.test.ts
  • packages/opencode/package.json
  • packages/pi/package.json
  • packages/web-observability/src/attribution.ts
  • packages/web-observability/src/events.ts
  • packages/web-observability/src/index.ts
  • packages/web-observability/src/privacy.ts
  • packages/web-observability/test/web-observability.test.ts
  • scripts/check-web-observability-env.ts
📝 Walkthrough

Walkthrough

This PR implements an end-to-end anonymous telemetry observability loop. It adds a new @caplets/web-observability shared package with typed event contracts, attribution helpers, and privacy filters. Runtime telemetry gains install-attribution persistence/consumption and sanitized Sentry exception stack frames. Landing, docs, and catalog sites receive PostHog/Sentry instrumentation scripts. All runtime packages get Sentry source-map build wiring via a shared rolldown helper, and CI workflows gain pre-deploy telemetry environment validation steps.

Changes

@caplets/web-observability shared package

Layer / File(s) Summary
Package scaffold, event types, attribution, and privacy
packages/web-observability/package.json, packages/web-observability/tsconfig.json, packages/web-observability/vitest.config.ts, packages/web-observability/src/events.ts, packages/web-observability/src/attribution.ts, packages/web-observability/src/privacy.ts, packages/web-observability/src/index.ts, packages/web-observability/test/web-observability.test.ts
Creates the new ESM package. events.ts defines WebSurface, WebEventName, bucket types, buildWebEvent, and bucketing helpers. attribution.ts provides attributedInstallCommand and attributionMarkerForSurface. privacy.ts provides assertWebEventSafeProperties, filterPostHogProperties, and filterSentryBrowserEvent with key/value allowlists and raw-value regex guards. Contract tests cover event construction, route classification, attribution markers, and PostHog/Sentry filter behavior.

Runtime telemetry: attribution and exception sanitization

Layer / File(s) Summary
Attribution state persistence and consumption
packages/core/src/telemetry/state.ts, packages/core/src/telemetry/index.ts, packages/core/test/telemetry-state.test.ts
Adds TelemetryAttribution* types, telemetryAttributionPath, and CRUD functions backed by attribution.json. consumeTelemetryAttribution reads from CAPLETS_INSTALL_ATTRIBUTION env var or stored state, deleting stored state after consumption. Tests validate that only categorical markers are persisted and unsafe URL markers are rejected.
Runtime Sentry exception sanitization
packages/core/src/telemetry/privacy.ts, packages/core/test/telemetry-redaction.test.ts
Adds SanitizedStackFrame, SanitizedRuntimeException, and sanitizeRuntimeException with internal stack-parsing helpers that validate frame fields, filter unsafe filenames, cap frame count, and mark in-app frames. stripSentryEvent now sanitizes and re-attaches exception frames. Tests assert unsafe frames are dropped and safe in-app frames are preserved.
Telemetry events, providers, and runtime capture wiring
packages/core/src/telemetry/events.ts, packages/core/src/telemetry/runtime.ts, packages/core/src/telemetry/providers.ts, packages/core/src/cli.ts, packages/core/test/telemetry-events.test.ts, packages/core/test/telemetry-providers.test.ts, packages/core/test/telemetry-runtime.test.ts
TelemetryProperties gains attribution fields; ReliabilityTelemetryEvent gains optional exception. Providers switch DSN to CAPLETS_RUNTIME_SENTRY_DSN and set release/environment. captureRuntimeTelemetryEvent consumes attribution on first successful event; captureRuntimeReliabilityEvent forwards raw error for sanitization. CLI wires both into captureCliTelemetry. Tests validate attribution one-shot consumption, exception payloads in dispatched events, and no leakage into debug output.

Sentry source-map build wiring

Layer / File(s) Summary
Runtime rolldown Sentry plugin and source-map env validator
scripts/runtime-sentry-rolldown.ts, packages/cli/rolldown.config.ts, packages/core/rolldown.config.ts, packages/opencode/rolldown.config.ts, packages/pi/rolldown.config.ts, scripts/check-sentry-source-maps.ts, packages/core/test/telemetry-source-maps.test.ts
sentryConfigured() and runtimeSentryPlugins(dist) gate and configure @sentry/rollup-plugin. All four runtime rolldown configs add output.sourcemap: sentryConfigured() and plugin wiring. checkSentrySourceMapEnv validates required Sentry upload env vars. Tests assert wiring presence across package configs and validator error messages.

Web surface observability scripts

Layer / File(s) Summary
Landing site observability and attributed copy
apps/landing/astro.config.mjs, apps/landing/src/scripts/observability.ts, apps/landing/src/scripts/copy.ts, apps/landing/src/pages/index.astro, apps/landing/package.json, apps/landing/vitest.config.ts, apps/landing/test/observability.test.ts
New observability script initializes PostHog/Sentry, captures pageview and outbound-click intent events with route/referrer/section/CTA classification. Copy script writes attributedLandingCommand(value) and emits captureLandingInstallCopy(). Astro build config adds conditional sentryVitePlugin with hidden sourcemaps. Tests validate attribution prefix and graceful no-provider import.
Docs site observability
apps/docs/astro.config.mjs, apps/docs/src/scripts/observability.ts, apps/docs/src/components/CapletsObservability.astro, apps/docs/src/components/CapletsThemeProvider.astro, apps/docs/package.json, apps/docs/vitest.config.ts, apps/docs/test/observability.test.ts
New observability script initializes PostHog/Sentry, captures pageview and anchor-click intent events. CapletsObservability.astro wraps the script; CapletsThemeProvider.astro renders it globally. Astro build config adds conditional sentryVitePlugin. Tests validate graceful import without provider config.
Catalog observability, server error capture, and search telemetry
apps/catalog/astro.config.mjs, apps/catalog/src/lib/catalog-env.ts, apps/catalog/src/lib/server-observability.ts, apps/catalog/src/pages/api/v1/catalog/install-signals.ts, apps/catalog/src/scripts/observability.ts, apps/catalog/src/scripts/copy.ts, apps/catalog/src/scripts/virtual-results.ts, apps/catalog/src/pages/..., alchemy.run.ts, apps/catalog/package.json, apps/catalog/test/observability.test.ts, apps/catalog/test/virtual-results.test.ts
New observability script captures pageview/install-copy/result-open/search events with bucketed properties. virtual-results.ts adds filterChanged discriminator to applySearch and emits search/result-open events. Copy script uses attributedCatalogCommand. captureCatalogServerError posts a Sentry envelope via fetch on ingestion errors; install-signals.ts calls it in the catch block. CatalogEnv gains three optional Sentry/release fields. Alchemy conditionally injects Sentry bindings. Tests validate attribution prefix, envelope POST sanitization, and updated copy assertion.

CI/workflow environment gates and release wiring

Layer / File(s) Summary
Web observability and release env validators
scripts/check-web-observability-env.ts, scripts/check-telemetry-release-env.ts, package.json, pnpm-workspace.yaml, packages/core/test/telemetry-release.test.ts
checkWebObservabilityEnv validates PostHog/Sentry DSNs, hosts, and slug-shaped org/project/env identifiers. check-telemetry-release-env.ts expands required env to full runtime Sentry configuration; switches bundled DSN source to CAPLETS_RUNTIME_SENTRY_DSN; adds isSafeSlug. Root scripts gain telemetry:check-source-maps and telemetry:check-web-env. pnpm-workspace.yaml allows @sentry/cli and core-js builds. Tests assert validators and workflow secret wiring.
Workflow env propagation for deploy, preview, and release
.github/workflows/deploy.yml, .github/workflows/pr-preview-deploy.yml, .github/workflows/release.yml
Deploy and preview workflows gain a "Check observability env" step running both telemetry check scripts with secrets, and extend their Deploy step env with full PUBLIC_CAPLETS_* observability configuration. Release workflow adds runtime Sentry auth/org/project/DSN/release/environment to the changesets step env.

Documentation, plans, and tooling updates

Layer / File(s) Summary
Telemetry docs, concepts, plan, and doc tests
CONCEPTS.md, docs/product/anonymous-telemetry.md, docs/product/telemetry-provider-readiness.md, docs/product/telemetry-readout.md, apps/docs/src/content/docs/privacy/indexing.mdx, apps/docs/src/content/docs/troubleshooting.mdx, docs/plans/2026-06-28-002-feat-telemetry-observability-loop-plan.md, packages/core/test/telemetry-docs.test.ts
Adds "Telemetry Observability Loop" and "Anonymous Install Attribution" concept entries. Updates provider-readiness doc to version 2 with concrete launch gates, Source-Map Release Shape section, and expanded revocation playbook. Expands telemetry readout decision questions and saved query contract. User-facing docs document the attribution marker and analytics boundary. Full implementation plan added. Doc tests assert new coverage.
Dependency and tooling version bumps
mise.toml, package.json, packages/*/package.json
Bumps pnpm to 11.9.0, updates Node types, TypeScript native preview, rolldown, vitest, astro, vite, @sentry/node, posthog-node, and related tooling across all workspace packages. Minor Babel parser option updates in static-analysis.ts.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • spiritledsoftware/caplets#151: Introduced the original anonymous telemetry foundation in packages/core/src/telemetry/* that this PR extends with attribution, sanitized exceptions, and new env vars.
  • spiritledsoftware/caplets#169: Established the catalog API and UI foundation that this PR builds on for catalog observability, server error reporting, and the install-signals.ts endpoint.

Poem

🐰 A hop through the logs, a skip past the stack,
Attribution markers lead the trail back!
PostHog counts pageviews, Sentry maps frames,
No raw paths or tokens—just categorical names.
Source maps upload when the secrets are set,
The observability loop is live—no TODO left! 🎉

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the PR’s main change: telemetry observability release wiring across builds and workflows.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/telemetry-observability-loop

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@socket-security

socket-security Bot commented Jun 29, 2026

Copy link
Copy Markdown

Warning

Review the following alerts detected in dependencies.

According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.

Action Severity Alert  (click "▶" to expand/collapse)
Warn High
License policy violation: npm @sentry/cli under LicenseRef-FSL-1.1-MIT

License: LicenseRef-FSL-1.1-MIT - The applicable license policy does not permit this license (5) (package/LICENSE)

From: pnpm-lock.yamlnpm/@sentry/rollup-plugin@5.3.0npm/@sentry/vite-plugin@5.3.0npm/@sentry/cli@2.58.6

ℹ Read more on: This package | This alert | What is a license policy violation?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Find a package that does not violate your license policy or adjust your policy to allow this package's license.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@sentry/cli@2.58.6. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm @sentry/node-core is 60.0% likely obfuscated

Confidence: 0.60

Location: Package overview

From: pnpm-lock.yamlnpm/@sentry/node@10.62.0npm/@sentry/node-core@10.62.0

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@sentry/node-core@10.62.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm astro is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: apps/catalog/package.jsonnpm/astro@7.0.3

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/astro@7.0.3. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm json-schema is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: pnpm-lock.yamlnpm/@opencode-ai/plugin@1.17.11npm/json-schema@0.4.0

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/json-schema@0.4.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm oxfmt is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: package.jsonnpm/oxfmt@0.56.0

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/oxfmt@0.56.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm oxfmt is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: package.jsonnpm/oxfmt@0.56.0

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/oxfmt@0.56.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm posthog-js is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: apps/catalog/package.jsonnpm/posthog-js@1.395.0

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/posthog-js@1.395.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm posthog-js is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: apps/catalog/package.jsonnpm/posthog-js@1.395.0

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/posthog-js@1.395.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm three is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: apps/landing/package.jsonnpm/three@0.185.0

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/three@0.185.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm web-vitals is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: pnpm-lock.yamlnpm/posthog-js@1.395.0npm/web-vitals@5.3.0

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/web-vitals@5.3.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

View full report

@github-actions

github-actions Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

@greptile-apps

greptile-apps Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR wires anonymous telemetry and error observability across all four surfaces (CLI runtime, landing, docs, catalog) using PostHog for product events and Sentry for reliability events, along with a new @caplets/web-observability shared package. It also updates the workspace toolchain (Astro 7, Vite 8, Babel 8, pnpm 11.9) and fixes static analysis to recognize Babel 8 ImportExpression nodes for dynamic imports.

  • Attribution tracking: a new caplets telemetry attribution <marker> sub-command (and CAPLETS_INSTALL_ATTRIBUTION env var fallback) records which web surface triggered an install; the marker is consumed and deleted after the first successful CLI event.
  • Privacy layer: both the runtime and browser paths strip all user content from Sentry events — only error type, sanitized filenames, and function names are forwarded; PostHog events are schema-validated against closed allowlists before dispatch.
  • CI wiring: deploy.yml, pr-preview-deploy.yml, and release.yml are updated to map consolidated secrets to the PUBLIC_* variables required by each target and to run observability env/source-map readiness checks before deploying.

Confidence Score: 5/5

Safe to merge — the telemetry and attribution paths are well-isolated from product behavior and are best-effort throughout.

All telemetry dispatches are wrapped in try/catch and never affect product flows. The privacy filters on both browser and server paths strip user content before forwarding to Sentry, and PostHog events are validated against closed allowlists. The attribution file lifecycle (claim → acknowledge → delete) correctly prevents duplicate attribution across re-runs. The two style-level findings have no impact on correctness or user privacy.

packages/web-observability/src/privacy.ts (sanitizeBrowserException missing empty-frames guard) and packages/core/src/cli.ts (duplicated architectureForTelemetry).

Important Files Changed

Filename Overview
packages/web-observability/src/privacy.ts New browser-side Sentry/PostHog filter; sanitizes filenames, function names, and exception types — but sanitizeBrowserException is missing the empty-frames guard present in the server-side equivalent.
packages/core/src/cli.ts Adds attribution claim/acknowledge lifecycle around the product telemetry event and wires error objects into reliability events; duplicates TELEMETRY_ARCHITECTURES/architectureForTelemetry from runtime.ts.
packages/core/src/telemetry/state.ts Adds file-backed and env-var-backed attribution mechanism with claim/acknowledge/release lifecycle; logic looks correct and file is properly deleted after first successful acknowledgement.
packages/core/src/telemetry/privacy.ts Adds sanitizeRuntimeException and sanitizeSentryException with proper empty-frames guard, stack line parser, and filename/function-name allowlists; server-side implementation is complete and consistent.
packages/web-observability/src/attribution.ts New file implementing attributedInstallCommand — prepends the telemetry attribution sub-command before the install command; idempotency guard and runner detection look correct.
packages/web-observability/src/events.ts New file defining typed web event schema, required/optional property sets, and bucket helpers; property validation and allowlist checks are thorough.
apps/catalog/src/scripts/observability.ts New browser-side PostHog + Sentry init for the catalog surface; all persistence/recording features disabled, no PII in captured events.
apps/catalog/src/lib/server-observability.ts New Cloudflare Worker Sentry reporting via manual envelope construction; only reports error type with no message or stack, no PII exposure.
packages/core/src/code-mode/static-analysis.ts Adds ImportExpression to the executable import node check (Babel 8 dynamic import node type) and removes topLevelAwait/importAttributes plugins in favour of allowAwaitOutsideFunction; straightforward Babel 8 compatibility fix.
.github/workflows/deploy.yml Maps consolidated secrets to PUBLIC_* variables for both the observability env check step and the deploy step; env block is consistent across both steps.
.github/workflows/release.yml Renames CAPLETS_SENTRY_DSN to CAPLETS_RUNTIME_SENTRY_DSN and adds Sentry auth/org/project/release/environment secrets for source-map upload during runtime package releases.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[User visits landing / docs / catalog] -->|copy install command| B[attributedInstallCommand\nweb-observability]
    B -->|prepends telemetry attribution marker cmd| C[Install command shown to user]
    C -->|user pastes & runs| D[caplets telemetry attribution marker]
    D -->|writeTelemetryAttribution| E[attribution.json on disk]
    D -->|or CAPLETS_INSTALL_ATTRIBUTION env var| E
    C --> F[caplets add / run ...]
    F -->|captureCliTelemetry| G{telemetry enabled?}
    G -- yes --> H[claimTelemetryAttribution\nread attribution.json or env var]
    H --> I[buildProductTelemetryEvent\nwith attribution_source + first_activation]
    I --> J[PostHog dispatch]
    J --> K[acknowledgeTelemetryAttributionClaim\ndelete file + env var]

    subgraph Browser Observability
        L[Page load] -->|filterSentryBrowserEvent\nsanitizeBrowserException| M[Sentry]
        L -->|buildWebEvent\nassertWebEventSafeProperties| N[PostHog]
    end

    subgraph Server Observability
        O[Catalog worker error] -->|captureCatalogServerError\nexceptionFor - type only| P[Sentry envelope API]
    end
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[User visits landing / docs / catalog] -->|copy install command| B[attributedInstallCommand\nweb-observability]
    B -->|prepends telemetry attribution marker cmd| C[Install command shown to user]
    C -->|user pastes & runs| D[caplets telemetry attribution marker]
    D -->|writeTelemetryAttribution| E[attribution.json on disk]
    D -->|or CAPLETS_INSTALL_ATTRIBUTION env var| E
    C --> F[caplets add / run ...]
    F -->|captureCliTelemetry| G{telemetry enabled?}
    G -- yes --> H[claimTelemetryAttribution\nread attribution.json or env var]
    H --> I[buildProductTelemetryEvent\nwith attribution_source + first_activation]
    I --> J[PostHog dispatch]
    J --> K[acknowledgeTelemetryAttributionClaim\ndelete file + env var]

    subgraph Browser Observability
        L[Page load] -->|filterSentryBrowserEvent\nsanitizeBrowserException| M[Sentry]
        L -->|buildWebEvent\nassertWebEventSafeProperties| N[PostHog]
    end

    subgraph Server Observability
        O[Catalog worker error] -->|captureCatalogServerError\nexceptionFor - type only| P[Sentry envelope API]
    end
Loading

Reviews (3): Last reviewed commit: "fix(telemetry): address observability re..." | Re-trigger Greptile

Comment thread packages/web-observability/src/privacy.ts Outdated
Comment thread packages/core/src/telemetry/privacy.ts
Comment on lines +125 to +132
return "external";
}

function filterCategory(
changed: "trust" | "setup" | "tag" | "reset" | undefined,
): NonNullable<WebEventProperties["filter_category"]> {
if (changed === "reset") return "clear";
if (changed === "tag") return "tag";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Search telemetry fires on every keystroke without debouncing

captureCatalogSearch is called from the input event listener on the search box (via applySearch), so every single keystroke generates a PostHog event. Typing a 10-character query produces 10 separate caplets_catalog_search events. A debounce of 400–500 ms on the search input handler would make the analytics data more useful and reduce event volume substantially.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in Codex

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 15

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/core/src/telemetry/runtime.ts (1)

71-86: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Attribution is consumed before you know the event was actually delivered.

consumeTelemetryAttribution() either deletes the stored marker immediately or replays CAPLETS_INSTALL_ATTRIBUTION on every call (packages/core/src/telemetry/state.ts, Lines 117-131). Doing that before dispatcher.capture() means dropped sends can lose persisted first-activation data, and long-lived runtimes can stamp multiple successful events with first_activation: true while the env var is still present. This needs a read/delete-on-ack flow or an in-process latch, and the same eager-consume pattern is duplicated in packages/core/src/cli.ts.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/core/src/telemetry/runtime.ts` around lines 71 - 86, The attribution
is being consumed too early in runtime telemetry, before `dispatcher.capture()`
confirms the event was delivered. Update `trackTelemetryEvent` in `runtime.ts`
to only call `consumeTelemetryAttribution()` after a successful send, or gate it
with an in-process latch so the same marker is not reused across multiple
successes; make the flow acknowledge delivery before deleting or replaying
attribution. Apply the same fix to the duplicated eager-consume logic in
`cli.ts`, and keep the attribution handling aligned with
`consumeTelemetryAttribution` and `attributionTelemetryProperties`.
🧹 Nitpick comments (2)
packages/core/test/telemetry-source-maps.test.ts (1)

31-39: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Assert the sourcemap wiring explicitly.

This loop only checks for helper names, so it still passes if a config imports sentryConfigured but accidentally sets output.sourcemap back to false. Adding an assertion for sourcemap: sentryConfigured() would make the test cover the actual release contract.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/core/test/telemetry-source-maps.test.ts` around lines 31 - 39, The
telemetry source maps test only verifies helper imports and can miss a broken
sourcemap wiring; update the assertions in telemetry-source-maps.test to
explicitly check that each config uses output.sourcemap: sentryConfigured() in
addition to the existing runtimeSentryPlugins checks. Use the config variables
coreConfig, cliConfig, opencodeConfig, and piConfig to locate the relevant
expectations and ensure the release contract is covered directly.
packages/core/test/telemetry-state.test.ts (1)

207-225: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a second consume against the same env object.

This case stops after the first env-backed read, so it won't catch duplicate first_activation tagging from repeated successful events in one process. Reusing the same env object for a second consumeTelemetryAttribution() call would lock in the one-shot contract.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/core/test/telemetry-state.test.ts` around lines 207 - 225, The
telemetry attribution test currently only exercises a single env-backed consume,
so it misses repeated successful reads in one process. Update the test around
consumeTelemetryAttribution and telemetryAttributionPath to call
consumeTelemetryAttribution twice with the same env object for the safe marker
case, and assert the second call is also undefined/no persistence so the
one-shot behavior is locked in.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/catalog/src/lib/server-observability.ts`:
- Around line 16-20: The sentryEnvelopeUrl helper is stripping any DSN path
prefix and only using the host plus project id, which can send envelopes to the
wrong endpoint for proxied or self-hosted Sentry DSNs. Update sentryEnvelopeUrl
to preserve the full pathname prefix from the parsed URL while still extracting
the project id from the last path segment, and build the envelope URL using that
prefix before /api/{projectId}/envelope/. Keep the existing validation in
sentryEnvelopeUrl and ensure the new URL is derived from the same URL object.

In `@apps/catalog/src/pages/api/v1/catalog/install-signals.ts`:
- Around line 44-45: The 500 error path in the install-signals handler is being
blocked by awaiting best-effort telemetry. Update the catch block in the API
handler so `captureCatalogServerError(...)` is not awaited; instead, schedule it
via `waitUntil(...)` when available or invoke it fire-and-forget, while still
returning the failure response immediately.

In `@apps/catalog/src/scripts/virtual-results.ts`:
- Around line 134-138: The `captureCatalogSearch` call inside `applySearch()` is
now being triggered too often because the same filter controls are wired to both
`input` and `change`, causing one user interaction to emit
`caplets_catalog_search` twice. Update the event wiring in `virtual-results.ts`
so `applySearch()`/`captureCatalogSearch` is invoked only once per interaction,
and use the existing `filterChanged` path to preserve the intended telemetry in
`applySearch`, `captureCatalogSearch`, and the control listeners around the
`input`/`change` bindings.

In `@apps/docs/src/scripts/observability.ts`:
- Around line 106-115: The linkCategory helper is classifying root-relative
catalog URLs as docs because the href.startsWith("/") check runs before the
catalog match. Update linkCategory in observability.ts so catalog paths like
/caplets and /caplets/... are detected and returned as "catalog" before the
generic root-relative docs rule, while keeping the existing github, npm,
docs.caplets, and unknown handling intact.

In `@apps/docs/test/observability.test.ts`:
- Around line 6-12: The test currently only checks that
document.addEventListener is not mocked, which does not verify that
../src/scripts/observability actually registers the click handler. Update
observability.test.ts to spy on document.addEventListener before importing
observability, or assert the expected mocked analytics/navigation callback after
dispatching the click, so the test covers the listener registration path in
observability rather than the native API shape.

In `@apps/landing/src/scripts/observability.ts`:
- Around line 116-123: The shared link classifier in linkCategory is missing
/caplets routes, so those outbound clicks are falling through to unknown. Update
linkCategory in observability.ts to treat href values starting with /caplets
(including nested paths) as catalog, alongside the existing /catalog and
catalog.caplets checks, so telemetry matches the behavior in the shared
classifier from packages/web-observability/src/events.ts.

In `@packages/core/package.json`:
- Around line 126-131: The dependency bump to `@types/node` in the workspace
manifests should stay aligned with the current Node 22 runtime target. Update
the package.json entries that were changed so the type version matches Node 22
rather than exposing Node 26-only APIs, or make the runtime target move in
lockstep if that is the intended change. Check the shared workspace manifests,
including packages/core/package.json, for the same version to keep them
consistent.

In `@packages/core/rolldown.config.ts`:
- Line 19: The core build is currently disabling Sentry upload via
runtimeSentryPlugins("core", { disable: "disable-upload" }), which leaves the
Node-targeted `@caplets/core` artifacts unuploaded and un-symbolicated. Update the
core rolldown config so the Node outputs are uploaded as well, either by
removing the upload disable flag or by configuring runtimeSentryPlugins("core")
to include the Node-targeted build artifacts alongside the browser ones. Verify
the change in the core config and any related upload setup so stack frames from
the externalized `@caplets/core` output can resolve correctly.

In `@packages/core/src/telemetry/privacy.ts`:
- Around line 241-247: The `relativeSafePath()` path-collapsing logic is
accepting unsafe `packages/...` and `apps/...` suffixes even when they contain
`.` or `..` traversal segments, which lets hostile path structure survive
sanitization. Update the workspace match handling in `privacy.ts` so it only
returns a workspace path when every segment after `packages/` or `apps/` is a
valid non-traversal segment, and fall back to the existing basename/redaction
logic otherwise. Keep the fix localized to `relativeSafePath()` and its
workspace suffix check so the redaction boundary remains strict.

In `@packages/core/src/telemetry/state.ts`:
- Around line 120-125: Consume CAPLETS_INSTALL_ATTRIBUTION only once in
telemetry/state.ts by updating the helper that reads env attribution in state.ts
so a valid value is treated as one-time input: after
attributionFromMarker(envMarker) succeeds, clear or ignore the env marker for
subsequent calls and ensure any stored attribution file is removed or marked
consumed before returning. Update the shared attribution path used by the
CLI/runtime product-event flows so repeated calls to the same helper cannot
re-emit first_activation from the same process or from a leftover file on the
next success.

In `@packages/web-observability/src/attribution.ts`:
- Around line 11-15: The shared attributedInstallCommand helper is emitting a
POSIX-style environment prefix that breaks Windows shells. Update
attributedInstallCommand to avoid hardcoding CAPLETS_INSTALL_ATTRIBUTION=...
before the command, and instead generate shell-specific attribution syntax or
move the attribution payload into a cross-shell format that the CLI can read.
Use the existing attributedInstallCommand and attributionMarkerForSurface
symbols to locate the change.

In `@packages/web-observability/src/events.ts`:
- Around line 15-32: Model the telemetry payload as a discriminated union
instead of a single shared Partial: update WebEventProperties in events.ts and
the buildWebEvent() contract so each event name maps to its own required/allowed
properties. Use the event name as the discriminator and split the current
generic fields into per-event shapes so invalid mixes like
caplets_catalog_search with CTA-only fields or missing search buckets are
rejected at compile time. Keep the shared event symbols (WebEventProperties and
buildWebEvent) as the entry points, but make their typing enforce the correct
property set for each event.

In `@packages/web-observability/src/privacy.ts`:
- Around line 83-92: The filter in filterSentryBrowserEvent is forwarding
event.exception unchanged, so the browser-side privacy scrub is incomplete.
Update this function to sanitize the exception payload before assigning
filtered.exception, ideally by adding a browser-specific exception sanitizer
that strips raw message text and frame filenames/URLs, or omit exception
entirely when it cannot be proven safe. Make sure the beforeSend path that uses
filterSentryBrowserEvent continues to receive only sanitized exception data.

In `@scripts/check-web-observability-env.ts`:
- Around line 47-50: The URL validation in isHttpUrl currently allows both http
and https, which lets browser telemetry endpoints slip through with insecure
schemes. Tighten the checks in isHttpUrl and the related PostHog/Sentry
validation paths so only https: endpoints are accepted for browser-side
observability, and ensure any callers that rely on this helper reject http:
values during the environment check.
- Around line 43-44: The placeholder check in isNonPlaceholder is missing values
that are already rejected by the release gate, so align both validators. Update
the placeholder list used by isNonPlaceholder in check-web-observability-env to
also treat change-me and todo before release as invalid, matching the behavior
of checkTelemetryReleaseEnv. Keep the normalization logic the same so all
comparisons still use trimmed, lowercase values.

---

Outside diff comments:
In `@packages/core/src/telemetry/runtime.ts`:
- Around line 71-86: The attribution is being consumed too early in runtime
telemetry, before `dispatcher.capture()` confirms the event was delivered.
Update `trackTelemetryEvent` in `runtime.ts` to only call
`consumeTelemetryAttribution()` after a successful send, or gate it with an
in-process latch so the same marker is not reused across multiple successes;
make the flow acknowledge delivery before deleting or replaying attribution.
Apply the same fix to the duplicated eager-consume logic in `cli.ts`, and keep
the attribution handling aligned with `consumeTelemetryAttribution` and
`attributionTelemetryProperties`.

---

Nitpick comments:
In `@packages/core/test/telemetry-source-maps.test.ts`:
- Around line 31-39: The telemetry source maps test only verifies helper imports
and can miss a broken sourcemap wiring; update the assertions in
telemetry-source-maps.test to explicitly check that each config uses
output.sourcemap: sentryConfigured() in addition to the existing
runtimeSentryPlugins checks. Use the config variables coreConfig, cliConfig,
opencodeConfig, and piConfig to locate the relevant expectations and ensure the
release contract is covered directly.

In `@packages/core/test/telemetry-state.test.ts`:
- Around line 207-225: The telemetry attribution test currently only exercises a
single env-backed consume, so it misses repeated successful reads in one
process. Update the test around consumeTelemetryAttribution and
telemetryAttributionPath to call consumeTelemetryAttribution twice with the same
env object for the safe marker case, and assert the second call is also
undefined/no persistence so the one-shot behavior is locked in.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 408cf369-f5b6-4a54-87b9-99d7821521e9

📥 Commits

Reviewing files that changed from the base of the PR and between c97c2a1 and 5fc375a.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (79)
  • .changeset/tidy-observability-traces.md
  • .github/workflows/deploy.yml
  • .github/workflows/pr-preview-deploy.yml
  • .github/workflows/release.yml
  • CONCEPTS.md
  • alchemy.run.ts
  • apps/catalog/astro.config.mjs
  • apps/catalog/package.json
  • apps/catalog/src/lib/catalog-env.ts
  • apps/catalog/src/lib/server-observability.ts
  • apps/catalog/src/pages/api/v1/catalog/install-signals.ts
  • apps/catalog/src/pages/caplets/[entryKey].astro
  • apps/catalog/src/pages/index.astro
  • apps/catalog/src/scripts/copy.ts
  • apps/catalog/src/scripts/observability.ts
  • apps/catalog/src/scripts/virtual-results.ts
  • apps/catalog/test/observability.test.ts
  • apps/catalog/test/virtual-results.test.ts
  • apps/docs/astro.config.mjs
  • apps/docs/package.json
  • apps/docs/src/components/CapletsObservability.astro
  • apps/docs/src/components/CapletsThemeProvider.astro
  • apps/docs/src/content/docs/privacy/indexing.mdx
  • apps/docs/src/content/docs/troubleshooting.mdx
  • apps/docs/src/scripts/observability.ts
  • apps/docs/test/observability.test.ts
  • apps/docs/vitest.config.ts
  • apps/landing/astro.config.mjs
  • apps/landing/package.json
  • apps/landing/src/pages/index.astro
  • apps/landing/src/scripts/copy.ts
  • apps/landing/src/scripts/observability.ts
  • apps/landing/test/observability.test.ts
  • apps/landing/vitest.config.ts
  • docs/plans/2026-06-28-002-feat-telemetry-observability-loop-plan.md
  • docs/product/anonymous-telemetry.md
  • docs/product/telemetry-provider-readiness.md
  • docs/product/telemetry-readout.md
  • mise.toml
  • package.json
  • packages/benchmarks/package.json
  • packages/cli/package.json
  • packages/cli/rolldown.config.ts
  • packages/core/package.json
  • packages/core/rolldown.config.ts
  • packages/core/src/cli.ts
  • packages/core/src/code-mode/platform-runtime.generated.ts
  • packages/core/src/code-mode/static-analysis.ts
  • packages/core/src/telemetry/events.ts
  • packages/core/src/telemetry/index.ts
  • packages/core/src/telemetry/privacy.ts
  • packages/core/src/telemetry/providers.ts
  • packages/core/src/telemetry/runtime.ts
  • packages/core/src/telemetry/state.ts
  • packages/core/test/telemetry-docs.test.ts
  • packages/core/test/telemetry-events.test.ts
  • packages/core/test/telemetry-providers.test.ts
  • packages/core/test/telemetry-redaction.test.ts
  • packages/core/test/telemetry-release.test.ts
  • packages/core/test/telemetry-runtime.test.ts
  • packages/core/test/telemetry-source-maps.test.ts
  • packages/core/test/telemetry-state.test.ts
  • packages/opencode/package.json
  • packages/opencode/rolldown.config.ts
  • packages/pi/package.json
  • packages/pi/rolldown.config.ts
  • packages/web-observability/package.json
  • packages/web-observability/src/attribution.ts
  • packages/web-observability/src/events.ts
  • packages/web-observability/src/index.ts
  • packages/web-observability/src/privacy.ts
  • packages/web-observability/test/web-observability.test.ts
  • packages/web-observability/tsconfig.json
  • packages/web-observability/vitest.config.ts
  • pnpm-workspace.yaml
  • scripts/check-sentry-source-maps.ts
  • scripts/check-telemetry-release-env.ts
  • scripts/check-web-observability-env.ts
  • scripts/runtime-sentry-rolldown.ts

Comment thread apps/catalog/src/lib/server-observability.ts Outdated
Comment thread apps/catalog/src/pages/api/v1/catalog/install-signals.ts Outdated
Comment thread apps/catalog/src/scripts/virtual-results.ts Outdated
Comment thread apps/docs/src/scripts/observability.ts
Comment thread apps/docs/test/observability.test.ts Outdated
Comment thread packages/web-observability/src/attribution.ts Outdated
Comment thread packages/web-observability/src/events.ts Outdated
Comment thread packages/web-observability/src/privacy.ts
Comment thread scripts/check-web-observability-env.ts Outdated
Comment thread scripts/check-web-observability-env.ts Outdated
@ian-pascoe ian-pascoe merged commit e517938 into main Jun 29, 2026
7 checks passed
@ian-pascoe ian-pascoe deleted the feat/telemetry-observability-loop branch June 29, 2026 11:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant